package com.qiusuo0226.core.controller;


import com.qiusuo0226.common.util.ListTool;
import com.qiusuo0226.core.pojo.entity.AdministrativeDivisionDO;
import com.qiusuo0226.core.pojo.query.RemoveBean;
import com.qiusuo0226.core.service.AdministrativeDivisionSerivce;
import com.qiusuo0226.mvc.util.JsonResultModel;
import com.qiusuo0226.platform.annotation.RequestRecord;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 行政区划前端控制层
 * @author qiusuo
 * @date 2022-04-05
 * 控制器(类上)上使用注解 @CrossOrigin:，表示该类的所有方法允许跨域
 */
@RestController
@RequestMapping("/manager/administrativeDivision")
@CrossOrigin
@Slf4j
public class AdministrativeDivisionController {

    @Autowired
    private AdministrativeDivisionSerivce administrativeDivisionSerivce;


    /**
     * 行政区划列表全量列表
     * @return 行政区划列表
     */
    @PostMapping("list")
    public JsonResultModel list(){
        JsonResultModel result = JsonResultModel.getInstance();
        String msg = null;
        List<AdministrativeDivisionDO> list = administrativeDivisionSerivce.list();
        result.setData(list);
        result.setCode("200");
        result.setSuccess(true);
        msg = "共计获得" + list.size() + "个区划信息";
        result.setMessage(msg);
        log.info(msg);
        return result;
    }

    /**
     * todo 根据父级唯一标识获取子行政区划树列表
     * @param pid 父级行政区划唯一标识
     * @return 行政区划列表
     */
    @PostMapping("/getListTreeByPid")
    @RequestRecord
    public JsonResultModel getListTreeByPid(@RequestParam(required = false,defaultValue = "0") long pid){
        return JsonResultModel.success("获取子行政区划树列表成功", administrativeDivisionSerivce.getListTreeByPid(pid));
    }

    /**
     * todo 根据父级唯一标识获取子行政区划列表
     * @param pid 父级行政区划唯一标识
     * @param pageNo 当前页，默认第1页
     * @param pageSize 每页数据量，默认10条每页
     * @param searchInfo 模糊查询内容
     * @return 行政区划列表
     */
    @PostMapping("/getListByPid")
    public JsonResultModel getListByPid(@RequestParam(required = false,defaultValue = "0") long pid,
                                        @RequestParam(required = false,defaultValue = "1") Integer pageNo,
                                        @RequestParam(required = false,defaultValue = "10") Integer pageSize,
                                        @RequestParam(required = false,defaultValue = "") String searchInfo){
        return JsonResultModel.success("分页获取子区划信息成功", administrativeDivisionSerivce.getListByPid(pid, pageNo, pageSize, searchInfo));
    }

    /**
     * todo 根据id获取父级行政区划
     * @param iid 当前行政区划唯一标识
     * @return 父级行政区划
     */
    @PostMapping("getParentById")
    public JsonResultModel getParentById(@RequestParam(required = false,defaultValue = "0") long iid) {
        AdministrativeDivisionDO entity = administrativeDivisionSerivce.getParentById(iid);

        return JsonResultModel.success(entity == null ? "父级行政区划不存在" : "获取父级行政区划成功", entity);
    }

    /**
     * 批量软删除行政区划
     * @param entity#ids 选中需要删除的行政区划唯一标识集合
     * @param entity#type 删除方式，1完全删除，2区划删除
     * @return 删除结果
     */
    @PostMapping("remove")
    public JsonResultModel remove(@RequestBody RemoveBean entity) {
        JsonResultModel result = JsonResultModel.getInstance();
        if (ListTool.isEmpty(entity.getIds())) {
            result.setSuccess(false);
            result.setCode("1001");
            result.setMessage("缺少删除必要参数，行政区划的唯一标识\"id\"");
        } else {
            int remove = 0;
            try {
                remove = administrativeDivisionSerivce.removeList(entity.getIds(), entity.getType());
                if ( remove > 0) {
                    result.setSuccess(true);
                    result.setCode("1000");
                    result.setMessage("删除行政区划成功");
                } else {
                    result.setSuccess(false);
                    result.setCode("1003");
                    result.setMessage("删除行政区划失败，删除数据发生改变，请刷新后重新操作！");
                }
            } catch (Exception e) {
                log.error(e.toString());
                result.setSuccess(false);
                result.setCode("1002");
                result.setMessage(e.getMessage());
            }
        }

        return result;
    }

    /**
     * 新增行政区划
     * @param entity 行政区划对象
     * @return 新增结果
     */
    @PostMapping("add")
    public JsonResultModel add(@RequestBody AdministrativeDivisionDO entity) {
        JsonResultModel result = JsonResultModel.getInstance();
        result.setCode("200");
        try {
            AdministrativeDivisionDO a = administrativeDivisionSerivce.add(entity);
            if (null != a){
                result.setSuccess(true);
                result.setData(a);
                result.setMessage("新增行政区划成功");
                result.setCode("1000");
            } else {
                result.setSuccess(false);
                result.setCode("1003");
                result.setMessage("新增行政区划失败");
            }
        } catch (Exception e) {
            result.setSuccess(false);
            result.setCode("1001");
            result.setMessage(e.getMessage());
        }
        return result;
    }

    /**
     * 修改行政区划
     * @param entity 行政区划对象
     * @return 修改结果
     */
    @PostMapping("modify")
    public JsonResultModel modify(@RequestBody AdministrativeDivisionDO entity) {
        JsonResultModel result = JsonResultModel.getInstance();
        result.setCode("1000");

        if (null != entity.getIid()) {
            try {
                int modify = administrativeDivisionSerivce.modify(entity);
                if (modify == 1) {
                    result.setMessage("修改行政区划成功");
                    result.setSuccess(true);
                }
            } catch (Exception e) {
                log.error(e.toString());
                result.setMessage("修改行政区划失败：" + e.getMessage());
                result.setSuccess(false);
                result.setCode("1002");
            }
        } else {
            result.setMessage("缺少修改行政区划的唯一标识iid");
            result.setSuccess(false);
            result.setCode("1001");
        }
        return result;
    }

    /**
     * todo 获取行政区划树
     * @return 结果
     */
    @GetMapping("getTree")
    public JsonResultModel getTree() {
        return JsonResultModel.success("获取行政区划树成功", administrativeDivisionSerivce.getTree());
    }

    @GetMapping("revert")
    public JsonResultModel revert() {
        administrativeDivisionSerivce.revert();
        return JsonResultModel.success();
    }

}
